﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область СлужебныйПрограммныйИнтерфейс

// СтандартныеПодсистемы.УправлениеДоступом

// Параметры:
//   Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение.
//
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
	
	Ограничение.Текст =
	"РазрешитьЧтениеИзменение
	|ГДЕ
	|	ЧтениеОбъектаРазрешено(Владелец)";
	
КонецПроцедуры

// Конец СтандартныеПодсистемы.УправлениеДоступом

////////////////////////////////////////////////////////////////////////////////
// Обработчики обновления.

Процедура ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию(Параметры) Экспорт
	
	ПолноеИмяОбъекта = Метаданные.РегистрыСведений.ДанныеБизнесПроцессов.ПолноеИмя();

	ПараметрыВыборки = Параметры.ПараметрыВыборки;
	ПараметрыВыборки.ПолныеИменаРегистров = ПолноеИмяОбъекта;
	ПараметрыВыборки.СпособВыборки = ОбновлениеИнформационнойБазы.СпособВыборкиИзмеренияНезависимогоРегистраСведений();
	
	БизнесПроцесс = "";
	ОтработаныВсеЗаписиРегистра = Ложь;
	Пока Не ОтработаныВсеЗаписиРегистра Цикл
		
		Запрос = Новый Запрос;
		Запрос.Текст =
		"ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 1000
		|	ДанныеБизнесПроцессов.Владелец КАК Владелец
		|ИЗ
		|	РегистрСведений.ДанныеБизнесПроцессов КАК ДанныеБизнесПроцессов
		|ГДЕ
		|	ДанныеБизнесПроцессов.Владелец > &БизнесПроцесс
		|	И ДанныеБизнесПроцессов.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияБизнесПроцессов.ПустаяСсылка)";
		Запрос.УстановитьПараметр("БизнесПроцесс", БизнесПроцесс);
		// @skip-check query-in-loop - Порционная обработка данных
		ИзмеренияРегистра = Запрос.Выполнить().Выгрузить();
		
		ДополнительныеПараметры = ОбновлениеИнформационнойБазы.ДополнительныеПараметрыОтметкиОбработки();
		ДополнительныеПараметры.ЭтоНезависимыйРегистрСведений = Истина;
		ДополнительныеПараметры.ПолноеИмяРегистра = ПолноеИмяОбъекта;
		ОбновлениеИнформационнойБазы.ОтметитьКОбработке(Параметры, ИзмеренияРегистра, ДополнительныеПараметры);
		
		КоличествоЗаписей = ИзмеренияРегистра.Количество();
		Если КоличествоЗаписей < 1000 Тогда
			ОтработаныВсеЗаписиРегистра = Истина;
		КонецЕсли;
		
		Если КоличествоЗаписей > 0 Тогда
			БизнесПроцесс = ИзмеренияРегистра[КоличествоЗаписей-1].Владелец;
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры

Процедура ОбработатьДанныеДляПереходаНаНовуюВерсию(Параметры) Экспорт
	
	ВыбранныеДанные = ОбновлениеИнформационнойБазы.ДанныеДляОбновленияВМногопоточномОбработчике(Параметры);
	ОбъектовОбработано = 0;
	ПроблемныхОбъектов = 0;
	ПлохиеДанные = Новый Соответствие;
	СостоянияБизнесПроцессов = Новый Соответствие;
	
	МетаданныеРегистра = Метаданные.РегистрыСведений.ДанныеБизнесПроцессов;
	ПолноеИмяОбъекта = МетаданныеРегистра.ПолноеИмя();
	
	Для Каждого Строка Из ВыбранныеДанные Цикл
		ПредставлениеСсылки = Строка(Строка.Владелец);
		НачатьТранзакцию();
		Попытка
			БлокировкаДанных = Новый БлокировкаДанных;
			ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(Строка.Владелец.Метаданные().ПолноеИмя());
			ЭлементБлокировкиДанных.УстановитьЗначение("Ссылка", Строка.Владелец);
			ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Разделяемый;
			
			ЭлементБлокировкиДанных = БлокировкаДанных.Добавить(ПолноеИмяОбъекта);
			ЭлементБлокировкиДанных.УстановитьЗначение("Владелец", Строка.Владелец);
			
			БлокировкаДанных.Заблокировать();
			
			ЕстьРеквизитСостояние = СостоянияБизнесПроцессов[Строка.Владелец.Метаданные().ПолноеИмя()];
			Если ЕстьРеквизитСостояние = Неопределено Тогда
				РеквизитСостояние = Строка.Владелец.Метаданные().Реквизиты.Найти("Состояние");
				ЕстьРеквизитСостояние = РеквизитСостояние <> Неопределено 
					И РеквизитСостояние.Тип.СодержитТип(Тип("ПеречислениеСсылка.СостоянияБизнесПроцессов"));
				СостоянияБизнесПроцессов[Строка.Владелец.Метаданные().ПолноеИмя()] = ЕстьРеквизитСостояние;
			КонецЕсли;	
			
			НаборЗаписей = РегистрыСведений.ДанныеБизнесПроцессов.СоздатьНаборЗаписей();
			НаборЗаписей.Отбор.Владелец.Установить(Строка.Владелец);

			СостояниеБизнесПроцесса = ?(ЕстьРеквизитСостояние, 
				ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Строка.Владелец, "Состояние"), 
				Перечисления.СостоянияБизнесПроцессов.Активен);
			Если СостояниеБизнесПроцесса = Неопределено Тогда
				ПлохиеДанные[Строка.Владелец] = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
					НСтр("ru = 'В регистре Бизнес-процессы имеются сведения о несуществующем бизнес-процессе ""%1"".'"),
					Строка.Владелец);
				ОбновлениеИнформационнойБазы.ОтметитьВыполнениеОбработки(НаборЗаписей);
				ЗафиксироватьТранзакцию();
				Продолжить;
			КонецЕсли;
			
			НаборЗаписей.Прочитать();
			Для Каждого СведенияОБизнесПроцессе Из НаборЗаписей Цикл
				СведенияОБизнесПроцессе.Состояние = СостояниеБизнесПроцесса;
			КонецЦикла;
			
			Если НаборЗаписей.Модифицированность() Тогда
				ОбновлениеИнформационнойБазы.ЗаписатьНаборЗаписей(НаборЗаписей);
			Иначе
				ОбновлениеИнформационнойБазы.ОтметитьВыполнениеОбработки(НаборЗаписей);
			КонецЕсли;
				
			ОбъектовОбработано = ОбъектовОбработано + 1;
			ЗафиксироватьТранзакцию();
		Исключение
			ОтменитьТранзакцию();
			ПроблемныхОбъектов = ПроблемныхОбъектов + 1;
			ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Не удалось обработать сведения о бизнес-процессе %1 по причине:
				|%2'"), 
				ПредставлениеСсылки, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
			ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Предупреждение,
				МетаданныеРегистра, Строка.Владелец, ТекстСообщения);
		КонецПопытки;
		
	КонецЦикла;
	
	Параметры.ОбработкаЗавершена = ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена(Параметры.Очередь, ПолноеИмяОбъекта);
	
	Для Каждого НеобработанныйОбъект Из ПлохиеДанные Цикл
		ОбновлениеИнформационнойБазы.ЗарегистрироватьПроблемуСДанными(НеобработанныйОбъект.Ключ, НеобработанныйОбъект.Значение);
	КонецЦикла;
	
	Если ОбъектовОбработано = 0 И ПроблемныхОбъектов <> 0 Тогда
		ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Не удалось обработать некоторые сведения о бизнес-процессах (пропущены): %1'"), 
			ПроблемныхОбъектов);
		ВызватьИсключение ТекстСообщения;
	Иначе
		ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), УровеньЖурналаРегистрации.Информация,
			МетаданныеРегистра,,
			СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Обработана очередная порция сведений о бизнес-процессах: %1'"),
				ОбъектовОбработано));
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#КонецЕсли
